<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <script type="module">

        // const myAsyncFun = async function (timeout) {

        //     return await new Promise((resolve, reject) => {
        //         // try {
        //             throw new Error("error");
        //         // } catch (error) {
        //         //     console.log(error);
        //         // }
        //     })

        // }

        // myAsyncFun(2000).then(function (data) {
        //     console.log(data);
        // }, function (err) {
        //     console.log(err);
        //     return Promise.reject(err);
        // }).catch(function (err) {
        //     console.log(err);
        // });



        // https://blog.csdn.net/guorui999/article/details/128705631

        // async function getResult() {
        //     await new Promise((resolve, reject)=>{
        //         setTimeout(() => {
        //             resolve(1)
        //             console.log(1);
        //         }, 1000);
        //     })
        //     await new Promise((resolve, reject)=>{
        //         setTimeout(() => {
        //             resolve(2)                    
        //             console.log(2);
        //         }, 500);
        //     })
        //     await new Promise((resolve, reject)=>{
        //         setTimeout(() => {
        //             resolve(3)
        //             console.log(3);
        //         }, 100);
        //     })
        // }
        // getResult() // 1 2 3


        // Generator + Promise 实现相同效果
        // // Generator 函数不同于普通函数，是可以暂停执行的，所以函数名之前要加星号 *，以示区别。

        // // yield是JS为了解决异步调用的命令。表示程序执行到这里会交出执行权，等待结果返回。它需要在协程Generator 函数中运行。

        // // 整个 Generator 函数就是一个封装的异步任务，或者说是异步任务的容器。异步操作需要暂停的地方，都用 yield 语句注明。

        // 原文链接：https://blog.csdn.net/guorui999/article/details/128705631

        // function* getResult() {
        //     yield new Promise((resolve, reject) => {
        //         setTimeout(() => {
        //             resolve(1)
        //             console.log(1);
        //         }, 1000);
        //     })
        //     yield new Promise((resolve, reject) => {
        //         setTimeout(() => {
        //             resolve(2)
        //             console.log(2);
        //         }, 500);
        //     })
        //     yield new Promise((resolve, reject) => {
        //         setTimeout(() => {
        //             resolve(3)
        //             console.log(3);
        //         }, 100);
        //     })
        // }
        // const gen = getResult()
        // // gen.next() = {value: yield 返回的数据， done： 迭代器是否走完}
        // // gen.next().value 就是每一次 yield 之后返回的 Promise

        // // 递归封装
        // function co(g) {
        //     const newObj = g.next()
        //     // 递归停止条件： 当迭代器到最后一个yield
        //     if (newObj.done) {
        //         return
        //     }
        //     nextObj.value.then(() => {
        //         co(g)
        //     })
        // }

        // co(gen) // 1 2 3



        // 自己用generator+promise  实现async +await
        // 返回一个承诺Promise
        function MyPromise(num) {
            return new Promise((resove, reject) => {
                setTimeout(() => {
                    resove(num * 2);
                }, 1000);
            })
        }

        const MyGenerator = function* (num) {
            let p_num1 = yield MyPromise(num);
            let p_num2 = yield MyPromise(p_num1);
            let p_num3 = yield MyPromise(p_num2);
        }

        const Go = function (mygenerator) {
            return function () {
                const mygen = mygenerator(1);
                ///
                return new Promise((resolve, reject) => {
                    const recursion = function (data) {
                        let result = mygen.next(data);
                        if (result.done == true) {
                            resolve(data);
                        } else {
                            let value = result.value;
                            value.then(
                                (tdata) => {
                                    recursion(tdata);
                                }
                            )
                        }
                    }
                    recursion();0
                });
                ///
            }
        }
        const myPromiseResult = Go(MyGenerator)();
        myPromiseResult.then(
            (data) => { console.log(data) },
            (err) => { console.log(err) }
        );

    </script>
</head>

<body>

</body>

</html>